package br.com.guardaroupavirtual.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.guardaroupavirtual.facade.Facade;
import br.com.guardaroupavirtual.helper.Diretorios;
import br.com.guardaroupavirtual.helper.HibernateHelper;
import br.com.guardaroupavirtual.model.Loja;
import br.com.guardaroupavirtual.model.Usuario;


@WebServlet(value="/LojaController", name="LojaController")
public class LojaController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	private HttpServletRequest request;
	private HttpServletResponse response;
	
	private Facade fachada;

	private Session session;
	private Transaction transaction;
	
	private String cmd;		
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		this.request = request;
		this.response = response;
		
		//Verifica se o usuário está logado
		if (request.getSession().getAttribute("usuario") == null) {
			request.getRequestDispatcher(String.format(Diretorios.Usuario, "login.jsp")).forward(request, response);
		}
		
		cmd = request.getParameter("cmd");
		
		//Verifica se foi passado uma ação para variavel cmd
		if(cmd == null || cmd.isEmpty()){
			request.setAttribute("lojas", this.getLojas());
			request.getRequestDispatcher(String.format(Diretorios.Loja, "lista_loja.jsp")).forward(request, response);
		}else{
			//Se o valor da variavel for cadastrar redireciona para pagina de cadastro de loja
			if(cmd.equalsIgnoreCase("cadastrar")){
				request.getRequestDispatcher(String.format(Diretorios.Loja, "cadastra_loja.jsp")).forward(request, response);
			}
			
			if(cmd.equalsIgnoreCase("alterar")){
				session = HibernateHelper.getSessionFactory().openSession();
				fachada = Facade.getCurrentInstance();
				Loja loja = fachada.getLoja(session, Integer.parseInt(request.getParameter("id")));
				Usuario usuarioSessao = (Usuario) request.getSession().getAttribute("usuario");
				if(loja.getUsuario().getId() != usuarioSessao.getId()){
					request.setAttribute("lojas", this.getLojas());
					request.setAttribute("mensagem", "O loja não encontrada!");
					request.getRequestDispatcher(String.format(Diretorios.Loja, "lista_loja.jsp")).forward(request, response);
				}				
				request.setAttribute("loja", loja);
				request.getRequestDispatcher(String.format(Diretorios.Loja, "altera_loja.jsp")).forward(request, response);
			}
			
			if (cmd.equalsIgnoreCase("deletar")) {
				this.deletar(request, response);
			}
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		this.request = request;
		this.response = response;		
		
		cmd = request.getParameter("cmd");
		
		if (cmd.equalsIgnoreCase("cadastrar")) {
			this.cadastrar();
		}
		
		if (cmd.equalsIgnoreCase("alterar")){
			this.alterar();
		}
	}

	private List<Loja> getLojas(){
		session = HibernateHelper.getSessionFactory().openSession();
		fachada= Facade.getCurrentInstance();		
		return fachada.getLojas(session);		
	}
	
	private void cadastrar() throws ServletException, IOException {
		try {
			session = HibernateHelper.getSessionFactory().openSession();
			transaction = session.beginTransaction();
			
			Loja loja = new Loja();
			loja.setNome(request.getParameter("nome"));
			loja.setCep(request.getParameter("cep"));
			loja.setLogradouro(request.getParameter("logradouro"));
			loja.setNumero(request.getParameter("numero"));
			loja.setBairro(request.getParameter("bairro"));
			loja.setCidade(request.getParameter("cidade"));
			loja.setUf(request.getParameter("uf"));
			Usuario usuario = (Usuario) request.getSession().getAttribute("usuario");
			loja.setUsuario(usuario);
			
			fachada = Facade.getCurrentInstance();
			fachada.cadastrarLoja(session, loja);
			transaction.commit();
			request.setAttribute("mensagem", "Registro inserido com sucesso!");
		} catch (Exception e) {
			request.setAttribute("mensagem", "Ocorreu um erro ao tentar inserir o registro!");
		}
		request.setAttribute("lojas", this.getLojas());
		request.getRequestDispatcher(String.format(Diretorios.Loja, "lista_loja.jsp")).forward(request, response);		
	}
	
	private void alterar() throws ServletException, IOException {
		try {
			session = HibernateHelper.getSessionFactory().openSession();
			transaction = session.beginTransaction();
			fachada = Facade.getCurrentInstance();			
			
			Loja loja = fachada.getLoja(session, Integer.parseInt(request.getParameter("id")));
			loja.setNome(request.getParameter("nome"));
			loja.setCep(request.getParameter("cep"));
			loja.setLogradouro(request.getParameter("logradouro"));
			loja.setNumero(request.getParameter("numero"));
			loja.setBairro(request.getParameter("bairro"));
			loja.setCidade(request.getParameter("cidade"));
			loja.setUf(request.getParameter("uf"));
			loja.setUsuario((Usuario)request.getSession().getAttribute("usuario"));
			
			fachada.alterarLoja(session, loja);
			transaction.commit();
			request.setAttribute("mensagem", "Registro alterado com sucesso!");
		} catch (Exception e) {
			request.setAttribute("mensagem", "Ocorreu um erro ao tentar alterar o registro!");
		}
		request.setAttribute("lojas", this.getLojas());
		request.getRequestDispatcher(String.format(Diretorios.Loja, "lista_loja.jsp")).forward(request, response);			
	}
	
	
	private void deletar(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		session = HibernateHelper.getSessionFactory().openSession();
		transaction = session.beginTransaction();
		try {
			fachada = Facade.getCurrentInstance();
			Loja loja = fachada.getLoja(session, Integer.parseInt(request.getParameter("id")));
			Usuario usuarioSessao = (Usuario) request.getSession().getAttribute("usuario");
			if(loja.getUsuario().getId() != usuarioSessao.getId()){
				request.setAttribute("lojas", this.getLojas());
				request.setAttribute("mensagem", "O loja não encontrada!");
				request.getRequestDispatcher(String.format(Diretorios.Loja, "lista_loja.jsp")).forward(request, response);
			}			
			fachada.deletarLoja(session, loja);
			transaction.commit();
			request.setAttribute("mensagem", "Registro excluido com sucesso!");
		} catch (Exception e) {
			request.setAttribute("mensagem", "Ocorreu um erro ao tentar excluir o registro!");
			transaction.rollback();			
		}
		request.setAttribute("lojas", this.getLojas());
		request.getRequestDispatcher(String.format(Diretorios.Loja, "lista_loja.jsp")).forward(request, response);
	}
}
